package com.learn.ch02ttlqueue.controller;

import com.learn.ch02ttlqueue.config.RabbitMqConfig;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.amqp.rabbit.core.RabbitTemplate;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

import java.util.Date;

/**
 * @author DJJ_F
 * @version 1.0
 * @date 2025/08/24
 * @description ch07 延迟队列
 * 负责发送消息到两个普通队列
 */
@Slf4j
@RestController
public class MessageController {
    @Resource
    private RabbitTemplate rabbitTemplate;

    @GetMapping("/ttl/send/{message}")
    public String sentMessage(@PathVariable("message") String message) {
        log.info("time: {}, message: {}", new Date(), message);
        // 消息转换（Convert）：
        // 自动将 Java 对象通过 消息转换器 序列化为 字节数组 ，以便在网络中传输。
        rabbitTemplate.convertAndSend("X", "XA", message);
        rabbitTemplate.convertAndSend("X", "XB", message);

        return message;
    }

    @GetMapping("/ttl/sendExp/{message}/{ttl}")
    public String sentMessageExp(@PathVariable("message") String message,
                                 @PathVariable("ttl") String ttl) {
        log.info("time: {}, message: {}", new Date(), message);
        // MessagePostProcessor参数设置消息时间
        rabbitTemplate.convertAndSend("X", "XC", message, msg -> {
            msg.getMessageProperties().setExpiration(ttl);
            return msg;
        });
        // 有个问题就是当第一个消息时间很长，第二个很短时，最终会一起处理，为了解决这个问题就引入了插件
        return "msg: " + message + ", ttl: " + ttl;
    }

    @GetMapping("/ttl/sendDelayed/{message}/{delayedTime}")
    public String sentMessageDelayed(@PathVariable("message") String message,
                                     @PathVariable("delayedTime") Integer delayedTime) {
        log.info("time: {}, message: {}", new Date(), message);
        // MessagePostProcessor参数设置消息时间
        rabbitTemplate.convertAndSend(RabbitMqConfig.DELAYED_EXCHANGE,
                RabbitMqConfig.DELAYED_ROUTING_KEY,
                message,
                msg -> {
            // setDelay
                    msg.getMessageProperties().setDelay(delayedTime);
                    return msg;
                });
        // 有个问题就是当第一个消息时间很长，第二个很短时，最终会一起处理，为了解决这个问题就引入了插件
        return "msg: " + message + ", ttl: " + delayedTime;
    }
}
